<?php
// +----------------------------------------------------------------------
// | ThinkCMF [ WE CAN DO IT MORE SIMPLE ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013-2014 http://www.thinkcmf.com All rights reserved.
// +----------------------------------------------------------------------
// | Author: Dean <zxxjjforever@163.com>
// +----------------------------------------------------------------------

namespace app\appapi\controller;

use cmf\controller\HomeBaseController;
use think\facade\Db;
/**
 * 微信公众号支付
 */
class WxpayController extends HomebaseController {
	
	
	//微信公众号 扫码支付  回调
	public function notify_ali() {
        
        
        require_once CMF_ROOT."sdk/zfbpay/config.php";
		require_once  CMF_ROOT."sdk/zfbpay/wappay/service/AlipayTradeService.php";
		// require_once "../../sdk/zfbpay/wappay/service/AlipayTradeService.php";
		// require_once "../../sdk/zfbpay/wappay/buildermodel/AlipayTradeWapPayContentBuilder.php";
		// require_once "../../sdk/zfbpay/config.php";


		$arr=$_POST;
		$alipaySevice = new \AlipayTradeService($config); 
		$alipaySevice->writeLog(var_export($_POST,true));
		$result = $alipaySevice->check($arr);
		$this->logali("orderinfo:".json_encode($arr));
		/* 实际验证过程建议商户添加以下校验。
		1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号，
		2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额），
		3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）
		4、验证app_id是否为该商户本身。
		*/
		// if($result) {//验证成功
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			//请在这里加上商户的业务逻辑程序代

			
			//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
			
			//获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
			
			//商户订单号

			$out_trade_no = $_POST['out_trade_no'];

			//支付宝交易号

			$trade_no = $_POST['trade_no'];
			

			//交易状态
			$trade_status = $_POST['trade_status'];
			// //交易金额
			// $total_fee = $_POST['total_fee'];


			if($_POST['trade_status'] == 'TRADE_FINISHED') {

				//判断该笔订单是否在商户网站中已经做过处理
					//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
					//请务必判断请求时的total_amount与通知时获取的total_fee为一致的
					//如果有做过处理，不执行商户的业务程序
						
				//注意：
				//退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知
			}
			else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
				//判断该笔订单是否在商户网站中已经做过处理
					//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
					//请务必判断请求时的total_amount与通知时获取的total_fee为一致的
					//如果有做过处理，不执行商户的业务程序			
				//注意：
				//付款完成后，支付宝系统发送该交易状态通知
				
				
				$out_trade_no_arr=explode("_",$out_trade_no);
				$notify_type=$out_trade_no_arr[2];
				if($notify_type=='0'){//充值
					$orderinfo=Db::name('charge_user')->where("orderno='{$out_trade_no}' and type='5'")->find();
					$this->logali("orderinfo111:".json_encode($orderinfo));	
					
					// $orderinfo=Db::name('charge_user')->where("orderno='{$out_trade_no}' and money='{$total_fee}' and type='1'")->find();
					// $this->logali("orderinfo:".json_encode($orderinfo));	
					if($orderinfo){
						if($orderinfo['status']==0){
							/* 更新会员虚拟币 */
							$coin=$orderinfo['coin']+$orderinfo['coin_give'];
							Db::name('user')->where("id='{$orderinfo['touid']}'")->inc("coin",$coin)->update();
							/* 更新 订单状态 */
							Db::name('charge_user')->where("id='{$orderinfo['id']}'")->update(array("status"=>1,"trade_no"=>$trade_no));
							
							/* 分销 */
							setAgentProfit($orderinfo['touid'],$orderinfo['coin']);
							
							$this->sendGroupMsg($orderinfo);
							$this->logali("orderno:".$out_trade_no."成功");
						}else{
							$this->logali("orderno:".$out_trade_no."已确认支付成功");
						}

						echo "success";		//请不要修改或删除
						exit;
					}else{
						$this->logali("orderno:".$out_trade_no.' 订单信息不存在');		
					}
				
				
				}else if($notify_type=='1'){//VIP回调处理
					$orderinfo=Db::name('vip_order')->where("orderno='{$out_trade_no}'  and type='5'")->find();
					$this->logali("orderinfo:".json_encode($orderinfo));	
					if($orderinfo){
						if($orderinfo['status']==0){
							/* 更新VIP */
							$length=$orderinfo['length'];
							$addtime=time();
							
							$vip=Db::name('vip_user')->where("uid={$orderinfo['uid']}")->find();
							if(!$vip){
								/* 未购买过 */
								$data=[
									'uid'=>$orderinfo['uid'],
									'addtime'=>$addtime,
									'endtime'=>$addtime + $length,
								];
								Db::name('vip_user')->insert($data);
							}else if($vip['endtime']< $addtime){
								/* 购买-已过期 */
								$data=[
									'addtime'=>$addtime,
									'endtime'=>$addtime + $length,
								];
								Db::name('vip_user')->where("uid={$orderinfo['uid']}")->update($data);
							}else{
								/* 续费 */
								$data=[
									'addtime'=>$addtime,
									'endtime'=>$vip['endtime'] + $length,
								];
								Db::name('vip_user')->where("uid={$orderinfo['uid']}")->update($data);
							}
							
							/* 更新 订单状态 */
							Db::name('vip_order')->where("id='{$orderinfo['id']}'")->update(array("status"=>1,"trade_no"=>$trade_no));
							
							/* 分销 */
							// setAgentProfit($orderinfo['uid'],$orderinfo['coin']);
							
							$this->logali("orderno:".$out_trade_no."成功");
						}else{
							$this->logali("orderno:".$out_trade_no."已确认支付成功");
						}

						echo "success";		//请不要修改或删除
						exit;
					}else{
						$this->logali("orderno:".$out_trade_no.' 订单信息不存在');		
					}
				}	
				
				

				// if($orderinfo){
					// if($orderinfo['status']==0){
						// /* 更新会员虚拟币 */
						// $coin=$orderinfo['coin']+$orderinfo['coin_give'];
						
						// Db::name('user')->where("id='{$orderinfo['touid']}'")->setInc("coin",$coin);
						
						// //更新最后一次充值时间
						// Db::name('user')->where("id='{$orderinfo['touid']}'")->update(array("paytime"=>time()));
						
						// /* 更新 订单状态 */
						// Db::name('charge_user')->where("id='{$orderinfo['id']}'")->update(array("status"=>1,"trade_no"=>$trade_no));
						
						// /* 分销 */
						// setAgentProfit($orderinfo['touid'],$orderinfo['coin']);
						
						// $this->sendGroupMsg($orderinfo);
							
						// $this->logali("orderno777:".$out_trade_no."成功");
					// }else{
						 // $this->logali("orderno888:".$out_trade_no."已确认支付成功");
					// }

					// echo "success";		//请不要修改或删除
					// exit;
				// }else{
					// $this->logali("orderno:".$out_trade_no.' 订单信息不存在');		
				// }
				
				
			}
			//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
				
			echo "success";		//请不要修改或删除
				
		// }else {
			// //验证失败
			// echo "fail";	//请不要修改或删除

		// }										
	}
	
	/* 充值成功 发送全站消息 */
	protected function sendGroupMsg($orderinfo){
        if($orderinfo){
            $userinfo=getUserInfo($orderinfo['uid']);
            
            $coin=$orderinfo['coin']+$orderinfo['coin_give'];
            $ext=[
                'method'=>'charge',
                'action'=>'0',
                'avatar'=>$userinfo['avatar'],
                'nickname'=>$userinfo['user_nickname'],
                'coin'=>(string)$coin,
            ];
            
            $configpri=getConfigPri();
            $group_id=$configpri['im_full_group_id'];
            $text_content=json_encode($ext);
            $receiver_id=null;
            $api=getTxRestApi();
            $ret = $api->group_send_group_system_notification($group_id, $text_content, $receiver_id);
            
            file_put_contents(CMF_ROOT.'log/sendGroupMsg_'.date('Y-m-d').'.txt',date('y-m-d H:i:s').'提交参数信息 text_content:'.json_encode($ext)."\r\n",FILE_APPEND);            
            file_put_contents(CMF_ROOT.'log/sendGroupMsg_'.date('Y-m-d').'.txt',date('y-m-d H:i:s').'提交参数信息 ret:'.json_encode($ret)."\r\n",FILE_APPEND);            
        }
	}
	
	//微信公众号 扫码支付  回调
	public function notify_native() {
        require_once CMF_ROOT."sdk/wxpay/lib/WxPay.Api.php";
        require_once CMF_ROOT."sdk/wxpay/lib/WxPay.Notify.php";
        
        //获取通知的数据
		//$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
		$xml=file_get_contents("php://input");
        
        $this->logwx("xml:".$xml);
/* 		$xml='<xml><appid><![CDATA[wxdbba8ae5cc57d71e]]></appid>
<attach><![CDATA[充值钻石,价值为600]]></attach>
<bank_type><![CDATA[OTHERS]]></bank_type>
<cash_fee><![CDATA[1]]></cash_fee>
<fee_type><![CDATA[CNY]]></fee_type>
<is_subscribe><![CDATA[Y]]></is_subscribe>
<mch_id><![CDATA[1230458202]]></mch_id>
<nonce_str><![CDATA[8foicjpqo7nokvbf1zm5n27tkdeez3xl]]></nonce_str>
<openid><![CDATA[oT36SuBF-U-oGxaySyaIzN9omiRA]]></openid>
<out_trade_no><![CDATA[22776_22776_1221161133_4409]]></out_trade_no>
<result_code><![CDATA[SUCCESS]]></result_code>
<return_code><![CDATA[SUCCESS]]></return_code>
<sign><![CDATA[DADE6279C771A953E20DD6A4ACD01520]]></sign>
<time_end><![CDATA[20191221161149]]></time_end>
<total_fee>1</total_fee>
<trade_type><![CDATA[NATIVE]]></trade_type>
<transaction_id><![CDATA[4200000432201912210816702746]]></transaction_id>
</xml>'; */
        
		//如果返回成功则验证签名
		try {
			$res = \WxPayResults::Init($xml);
		} catch (WxPayException $e){
			$msg = $e->errorMessage();
			return false;
		}
        
        $transaction_id=$res['transaction_id'];
        $this->logwx("transaction_id:".$transaction_id);
        
        $input = new \WxPayOrderQuery();
		$input->SetTransaction_id($transaction_id);
		$result = \WxPayApi::orderQuery($input);
        
        $this->logwx("result:".json_encode($result));
        
		//Log::DEBUG("query:" . json_encode($result));
		if(array_key_exists("return_code", $result)
			&& array_key_exists("result_code", $result)
			&& $result["return_code"] == "SUCCESS"
			&& $result["result_code"] == "SUCCESS")
		{
            
            
            $attach=$result['attach'];
			$out_trade_no=$result['out_trade_no'];
			$fee=$result['total_fee'];
			$transaction_id=$result['transaction_id'];
            
            $where['orderno']=$out_trade_no;
            $where['type']=2;
            
            $data=[
                'trade_no'=>$transaction_id
            ];
            
            $this->logwx("where:".json_encode($where));	
            $res=handelCharge($where,$data);
            if($res==0){
                $this->logwx("orderno:".$out_trade_no.' 订单信息不存在');	
                echo $this -> returnInfo("FAIL","订单信息不存在");
                exit;	
            }
            
            $this->logwx("成功");
            echo $this -> returnInfo("SUCCESS","OK");
            exit;
		}
        
        echo $this -> returnInfo("FAIL","签名失败");
        exit;										
	}

	//微信公众号内支付 回调
	public function notify_jsapi() {
        require_once CMF_ROOT."sdk/wxpay/lib/WxPay.Api.php";
        require_once CMF_ROOT."sdk/wxpay/lib/WxPay.Notify.php";
        
        //获取通知的数据
		//$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
		$xml=file_get_contents("php://input");
        
        $this->logwx2("xml:".$xml);
        
		//如果返回成功则验证签名
		try {
			$res = \WxPayResults::Init($xml);
		} catch (WxPayException $e){
			$msg = $e->errorMessage();
			return false;
		}
        
        $transaction_id=$res['transaction_id'];
        
        $input = new \WxPayOrderQuery();
		$input->SetTransaction_id($transaction_id);
		$result = \WxPayApi::orderQuery($input);
        
		//Log::DEBUG("query:" . json_encode($result));
		if(array_key_exists("return_code", $result)
			&& array_key_exists("result_code", $result)
			&& $result["return_code"] == "SUCCESS"
			&& $result["result_code"] == "SUCCESS")
		{
            $attach=$result['attach'];
			$out_trade_no=$result['out_trade_no'];
			$fee=$result['total_fee'];
			$transaction_id=$result['transaction_id'];
            
            $where['orderno']=$out_trade_no;
            $where['type']=2;
            
            $data=[
                'trade_no'=>$transaction_id
            ];
            
            $this->logwx2("where:".json_encode($where));	
			$this->logwx2("out_trade_no:".json_encode($out_trade_no));	
			
			$orderinfo=Db::name('charge_user')->where("orderno='{$where['orderno']}' and type='2'")->find();
			$this->logwx2("orderinfo111:".json_encode($orderinfo));	
			if($orderinfo){
				if($orderinfo['status']==0){
					/* 更新会员虚拟币 */
					$coin=$orderinfo['coin']+$orderinfo['coin_give'];
					
					Db::name('user')->where("id='{$orderinfo['touid']}'")->inc("coin",$coin)->update();
					
					//更新最后一次充值时间
					Db::name('user')->where("id='{$orderinfo['touid']}'")->update(array("paytime"=>time()));
					
					/* 更新 订单状态 */
					Db::name('charge_user')->where("id='{$orderinfo['id']}'")->update(array("status"=>1,"trade_no"=>$transaction_id));
					
					/* 分销 */
					setAgentProfit($orderinfo['touid'],$orderinfo['coin']);
					
					$this->sendGroupMsg($orderinfo);
						
					$this->logwx2("orderno777:".$where['orderno']."成功");
				}else{
					 $this->logwx2("orderno888:".$where['orderno']."已确认支付成功");
				}

				echo "success";		//请不要修改或删除
				exit;
			}else{
				$this->logwx2("orderno:".$out_trade_no.' 订单信息不存在');		
			}
			
            // $res=handelCharge($where,$data);
            // if($res==0){
                // $this->logwx2("orderno:".$out_trade_no.' 订单信息不存在');	
                // echo $this -> returnInfo("FAIL","订单信息不存在");
                // exit;	
            // }
			// $this->logwx2("orderno有没有:".$out_trade_no);	
			// $orderinfo=Db::name('charge_user')->where("orderno='{$out_trade_no}' and type='2'")->find();
			// $this->logwx2("orderinfo111:".json_encode($orderinfo));	
			// if($orderinfo){
				// if($orderinfo['status']==0){
					// /* 更新会员虚拟币 */
					// $coin=$orderinfo['coin']+$orderinfo['coin_give'];
					
					// Db::name('user')->where("id='{$orderinfo['touid']}'")->setInc("coin",$coin);
					
					// //更新最后一次充值时间
					// Db::name('user')->where("id='{$orderinfo['touid']}'")->update(array("paytime"=>time()));
					
					// /* 更新 订单状态 */
					// Db::name('charge_user')->where("id='{$orderinfo['id']}'")->update(array("status"=>1,"trade_no"=>$trade_no));
					
					// /* 分销 */
					// setAgentProfit($orderinfo['touid'],$orderinfo['coin']);
					
					// $this->sendGroupMsg($orderinfo);
						
					// $this->logwx2("orderno777:".$out_trade_no."成功");
				// }else{
					 // $this->logwx2("orderno888:".$out_trade_no."已确认支付成功");
				// }

				// echo "success";		//请不要修改或删除
				// exit;
			// }
			
			
            $this->logwx2("成功");
            echo $this -> returnInfo("SUCCESS","OK");
            exit;
		}
		
        echo $this -> returnInfo("FAIL","签名失败");
        exit;										
	}

	private function returnInfo($type,$msg){
		if($type == "SUCCESS"){
			return $returnXml = "<xml><return_code><![CDATA[{$type}]]></return_code></xml>";
		}else{
			return $returnXml = "<xml><return_code><![CDATA[{$type}]]></return_code><return_msg><![CDATA[{$msg}]]></return_msg></xml>";
		}
	}
    
	/* PC扫码 */
	public function logwx($msg){
		file_put_contents(CMF_ROOT.'log/paylog/logwxpay_'.date('Y-m-d').'.txt',date('Y-m-d H:i:s').'  msg:'.$msg."\r\n",FILE_APPEND);
	}	
    
    /* 公众号 */
	public function logwx2($msg){
		file_put_contents(CMF_ROOT.'log/paylog/logwxpay2_'.date('Y-m-d').'.txt',date('Y-m-d H:i:s').'  msg:'.$msg."\r\n",FILE_APPEND);
	}	

	/* 打印log */
	protected function logali($msg){
		file_put_contents(CMF_ROOT.'log/paylog/logali111_'.date('Y-m-d').'.txt',date('Y-m-d H:i:s').'  msg:'.$msg."\r\n",FILE_APPEND);
	}
						

}


